package main

import "fmt"

// 这是一个 包内变量 不是 全局变量 ，没有全局变量
// 变量定义后必须被使用 否则会报错
var global_aa = 33 // 函数外边不能 global := 33
var global_ss = "kkk"

var (
	globalAa = 33
	globalBb = true
	globalSs = 44
)

// 不赋初值
func variableZeroValue() {
	var a int
	var s string
	fmt.Printf("%d %q\n", a, s)
}

/*
	赋初值
*/
func variableInitialValue() {
	var a, b int = 3, 4
	var s string = "abc"
	fmt.Println(a, b, s)
}

// 类型推断
func variableTypeDeduction() {
	var a, b, c, s = 3, 4, true, "def"
	fmt.Println(a, b, c, s)
}

// 变量声明 简写形式
func variableShorter() {
	a, b, c, s := 3, 4, true, "def"
	b = 5 // 不能 b := 5 ,二次赋值
	fmt.Println(a, b, c, s)
}

func main() {
	variableZeroValue()
	variableInitialValue()
	variableTypeDeduction()
	variableShorter()
	fmt.Println(globalAa, globalBb, globalSs)
}

// 使用var关键字定义 变量 ，
// 可以声明多个 ，可以声明且赋初值多个
// 可以放在函数内 或者 包内
// var() 集中定义变量 （函数内 或者 包内）
// 编译器可以自动推断类型
// := 简写定义变量 （只能在函数内使用，不能用在函数外的包内）
